package com.czy.server;

import com.czy.model.Entity;
import com.czy.model.Mapping;
import lombok.Getter;
import lombok.Setter;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;


import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * @author czy
 * @date 2021-5-26 17:28
 */
@Getter
@Setter
public class WebDom4j {
    private List<Entity> entityList;//用于存储是N多Entity,而每一个Entity都是servlet-name与servlet-class
    private List<Mapping> mappingList;//用于存储N多Mapping,而每一个Mapping都是一个servlet-name与N多个url-pattern

    //构造方法
    public WebDom4j() {
        entityList=new ArrayList<Entity>();
        mappingList=new ArrayList<Mapping>();
    }
    //获取Document对象的方法
    public Document getDocument(){
        try {
            //(1)创建SAXReader对象
            SAXReader reader=new SAXReader();
            //(2)调用read方法
            return reader.read(new File("D:\\workspace\\tomcat\\src\\main\\resources\\web.xml"));
        } catch (DocumentException e) {
            e.printStackTrace();
        }
        return null;
    }
    public void parse(Document doc){
        //(1)获取根元素
        Element root=doc.getRootElement(); //web-app
        //(2)获取servlet子元素
        for(Iterator<Element> ite = root.elementIterator("servlet"); ite.hasNext();){
            Element subElement=ite.next();//得到每一个servlet
            //创建一个实体类
            Entity ent=new Entity(); //用于存储servlet-name与servlet-class
            for(Iterator<Element> subIte=subElement.elementIterator();subIte.hasNext();){
                Element ele=subIte.next(); //可能是servlet-name,也可能是servlet-class
                if("servlet-name".equals(ele.getName())){
                    ent.setName(ele.getText()); //给实体类中的name赋值
                }else if("serlvet-class".equals(ele.getName())){
                    ent.setClazz(ele.getText());
                }
            }
            //将Entity添加到集合中
            entityList.add(ent);
        }
        //测试
        /**for (Entity entity : entityList) {
         System.out.println(entity.getName()+"\t"+entity.getClazz());
         }*/
        //解析servlet-mapping

        for(Iterator<Element> ite=root.elementIterator("servlet-mapping");ite.hasNext();){
            Element subEle=ite.next();//得到每一个servlet-mapping
            //创建一个Mapping类的对象
            Mapping map=new Mapping();
            //解析servlet-mapping下的子元素
            for(Iterator<Element> subIte=subEle.elementIterator();subIte.hasNext();){
                Element ele=subIte.next();  //servlet-name，也有可能是url-pattern
                if("serlvet-name".equals(ele.getName())){
                    map.setName(ele.getText());
                }else if("url-pattern".equals(ele.getName())){
                    //获取集合对象，调用集合对象的添加方法，添加元素素
                    map.getUrlPattern().add(ele.getText());
                }
            }
            //Mapping添加到集合中
            mappingList.add(map);
        }
        //测试
		/*for (Mapping m : mappingList) {
			System.out.println(m.getName());
			for(String s:m.getUrlPattern()){
				System.out.println(s);
			}
		}*/
        //测试
        for(Entity entity:entityList) {
            System.out.println(entity.getName()+"\t"+entity.getClazz());
        }
    }
    //用于测试
    public static void main(String[] args) {
        WebDom4j web=new WebDom4j();
        web.parse(web.getDocument());
    }
}
